﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using APILocawebGateway.REDECARD.QueryString;
using APILocawebGateway.REDECARD.Respostas;
using System.Collections.Specialized;
namespace APILocawebGateway.REDECARD
{
    public sealed class GerenciadorRequisicaoREDECARD
    {
        ConfiguracaoREDECARD _configuracaoRedeCard;


        /// <summary>
        /// Este método obtem o retorno do primeiro envio de dados 
        /// para o componente da locaweb.
        /// </summary>
        /// <param name="context">Contexto do qual os dados serão obtidos</param>
        /// <returns>objeto do tipo respostaREDECARD que contém os dados de retorno encapsulados</returns>
        public RespostaREDECARD ObterResposta(HttpContext contexto)
        {
            RespostaREDECARD respostaRedeCard = new RespostaREDECARD();
            respostaRedeCard.CodigoAutorizacao = contexto.Request[RespostaQueryStringREDECARD.CODIGOAUTORIZACAO];
            respostaRedeCard.CodigoRetorno = contexto.Request[RespostaQueryStringREDECARD.CODIGORETORNOAVS];
            respostaRedeCard.ComprovanteVenda = contexto.Request[RespostaQueryStringREDECARD.COMPROVANTEVENDA];
            respostaRedeCard.DataTransacao = contexto.Request[RespostaQueryStringREDECARD.DATATRANSACAO];
            respostaRedeCard.MensagemRetorno = contexto.Request[RespostaQueryStringREDECARD.MENSAGEMRETORNO];
            respostaRedeCard.NumeroAutenticacao = contexto.Request[RespostaQueryStringREDECARD.NUMEROAUTENTICACAO];
            respostaRedeCard.NumeroPedido = contexto.Request[RespostaQueryStringREDECARD.NUMEROPEDIDO];
            respostaRedeCard.NumeroSequencialUnico = contexto.Request[RespostaQueryStringREDECARD.NUMEROSEQUENCIALUNICO];
            respostaRedeCard.CampoLivre = contexto.Request[RespostaQueryStringREDECARD.CAMPOLIVRE];
            if (!String.IsNullOrEmpty(contexto.Request[RespostaQueryStringREDECARD.STATUS]) && contexto.Request[RespostaQueryStringREDECARD.STATUS] != "0")
            {
                respostaRedeCard.StatusTransacao = contexto.Request[RespostaQueryStringREDECARD.STATUS];
                respostaRedeCard.MensagemRetorno = contexto.Request[RespostaQueryStringREDECARD.MENSAGEMRETORNOTRANSACAO];
            }
            else
            {
                respostaRedeCard.StatusTransacao = "0";
                respostaRedeCard.MensagemRetorno = String.Empty;


            }

            return respostaRedeCard;
        }

        /// <summary>
        /// Este método realiza a requisição de captura e retorna uma string com o código de resposta
        /// </summary>
        /// <param name="respostaRedeCard">objeto do tipo respostaREDECARD</param>
        /// <param name="transacaoOrigem">Identificador que pode ser obtido em APILocawebGateway.REDECARD.TransacaoOrigem</param>
        /// <param name="valorCaptura">Valor da captura, deve ser o mesmo da valor enviado no formulário</param>
        /// <param name="quantidadeParcelas">Quantidade de parcelas, é relacionada à TransacaoOrigem, visualizar manual da locaweb</param>
        /// <returns></returns>
        public String RealizarRequisicaoCaptura(RespostaREDECARD respostaRedeCard, ITransacaoOrigem transacaoOrigem, Decimal valorCaptura, Int32 quantidadeParcelas)
        {
            String quantidadeParcelasAsString = quantidadeParcelas.ToString();
            for (int i = quantidadeParcelasAsString.Length; quantidadeParcelasAsString.Length < 2; i++)
                quantidadeParcelasAsString = "0" + quantidadeParcelasAsString;

            NameValueCollection queryStringCaptura = new NameValueCollection();
            queryStringCaptura.Add("DATA", respostaRedeCard.DataTransacao);
            queryStringCaptura.Add("TRANSACAO", "203");
            queryStringCaptura.Add("TRANSORIG", transacaoOrigem.ToString());//completar
            queryStringCaptura.Add("PARCELAS", quantidadeParcelasAsString);
            queryStringCaptura.Add("FILIACAO", _configuracaoRedeCard.Filiacao);
            queryStringCaptura.Add("TOTAL", UtilidadesREDECARD.FormataMoedaParaConfirmacaoREDECARD(valorCaptura));
            queryStringCaptura.Add("NUMPEDIDO", respostaRedeCard.NumeroPedido);
            queryStringCaptura.Add("NUMAUTOR", respostaRedeCard.CodigoAutorizacao);
            queryStringCaptura.Add("NUMCV", respostaRedeCard.ComprovanteVenda);
            queryStringCaptura.Add("NUMSQN", respostaRedeCard.NumeroSequencialUnico);

            return Utilidades.RealizarRequisicaoModoGet("http://ecommerce.redecard.com.br/pos_virtual/confirma.asp", queryStringCaptura);

        }

        /// <summary>
        /// Construtor do Gerenciador de requisição RedeCard a configuração RedeCard deve ser passada como parâmetro
        /// </summary>
        /// <param name="configuracaoRedeCard">Objeto do tipo ConfiguracaoREDECARD</param>
        public GerenciadorRequisicaoREDECARD(ConfiguracaoREDECARD configuracaoRedeCard)
        {
            _configuracaoRedeCard = configuracaoRedeCard;
        }
    }
}
